<?php

  /**
   * Login
   *
   * Класс модели авторизации пользователя на сайте
   */

  class Login extends CModel
  {
    /**
     * присланный логин
     *
     * @var string
     */
    public $login = "";

    /**
     * присланный пароль
     *
     * @var string
     */
    public $paswd = "";

    /**
     * конструктор
     *
     * @param array  $attributes атрибуты модели
     * @param string $scenario   сценарий
     * @access public
     */
    public function __construct(array $attributes, $scenario = "login")
    {
      $this->scenario   = $scenario;
      $this->attributes = $attributes;
    }

    /**
     * отображаемые названия атрибутов модели
     *
     * @return string[]
     * @access public
     */
    public function attributeLabels()
    {
      return array("login" => "логин", "paswd" => "пароль");
    }

    /**
     * названия атрибутов модели
     *
     * @return string[]
     * @access public
     */
    public function attributeNames()
    {
      return array("login", "paswd");
    }

    /**
     * правила проверки атрибутов модели
     *
     * @return array[]
     * @access public
     */
    public function rules()
    {
      return array(
        array("login,paswd", "required", "message" => "Укажите свой {attribute}", "on" => "login"),
        array("login", "required", "message" => "Укажите URL своего аккаунта ВКонтакте", "on" => "vkontakte"),
        array("login", "authenticate"),
        array("paswd", "safe", "on" => "vkontakte")
      );
    }

    /**
     * аутентификация пользователя по присланным логину и паролю
     *
     * @return void
     * @access public
     */
    public function authenticate()
    {
      if (!$this->hasErrors())
      {
        /** @var $identity AUserIdentity */
        switch ($this->scenario)
        {
          case "login"    : $identity = new LoginUserIdentity($this->login, $this->paswd); break;
          case "vkontakte": $identity = new VKUserIdentity($this->login); break;
          default         : $identity = null;
        }

        $identity->authenticate();

        switch ($identity->errorCode)
        {
          case AUserIdentity::ERROR_USERNAME_INVALID:
            $this->addError("login", "Неверный логин");
            break;

          case AUserIdentity::ERROR_PASSWORD_INVALID:
            $this->addError("paswd", "Неверный пароль");
            break;

          case AUserIdentity::ERROR_ACCOUNT_INVALID :
            $this->addError("login", "Аккаунт не связан ни с одним из зарегистрированных пользователей");
            break;

          case AUserIdentity::ERROR_NONE             :
            if (User::model()->findByPk($identity->id)->activate_code === null)
              Yii::app()->user->login($identity);
            break;
        }
      }
    }
  }

?>
